package clientes;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.joda.time.DateTime;

public class Cliente implements ObservadorEnvio, ObservadorCtaCte {

	private String nombre;
	private String dni;
	private String email;
	private String domicilio;
	private CtaCte ctaCte;
	private Map<DateTime, Double> montosGastadosEnFecha;

	public Cliente(String nombre, String dni, String email, String domicilio) {
		this.nombre = nombre;
		this.dni = dni;
		this.email = email;
		this.domicilio = domicilio;
		this.montosGastadosEnFecha = new HashMap<DateTime, Double>();
	}

	public Cliente(String nombre, String dni, String email, String domicilio,
			CtaCte ctacte) {

		this(nombre, dni, email, domicilio);
		this.ctaCte = ctacte;

	}

	public Double consultaSaldo() {
		return this.ctaCte.saldoActual();
	}

	public String nombre() {
		return this.nombre;
	}

	public String e_mail() {
		return this.email;
	}

	public String domicilio() {
		return this.domicilio;
	}

	public String dni() {
		return this.dni;
	}

	@Override
	public void seRealizoUnaTransaccion(DateTime fecha, Double monto) {
		this.montosGastadosEnFecha.put(fecha, monto);

	}

	@Override
	public void tuPedidoPuedeSerResuelto() {
		this.enviarEmail();
	}

	public void enviarEmail() {

	}

	public CtaCte ctaCte() {

		return this.ctaCte;
	}

	public void registrarUnaCompra(Double unMonto) {
		DateTime fechaValor = DateTime.now();

		if (this.montosGastadosEnFecha.containsKey(fechaValor)) {
			Double valorParaClaveTemporal = this.montosGastadosEnFecha
					.get(fechaValor) + unMonto;
			this.montosGastadosEnFecha.put(fechaValor, valorParaClaveTemporal);
		} else {
			this.montosGastadosEnFecha.put(fechaValor, unMonto);
		}
	}

	public Double totalConsumido() {

		return this.sumarMontos(this.montosGastadosEnFecha.values());
	}

	private Double sumarMontos(Collection<Double> montos) {
		Double total = 0D;

		for (Double doubleIterable : montos) {
			total = total + doubleIterable;

		}
		return total;
	}

//	public Map<DateTime, Double> montosDespuesDeFecha(DateTime unaFecha) {
//		Map<DateTime, Double> mapResultado = new HashMap<DateTime, Double>();
//
//		for (Entry<DateTime, Double> tuplaDateTimeDouble : this.montosGastadosEnFecha
//				.entrySet()) {
//			if (tuplaDateTimeDouble.getKey().isAfter(unaFecha)) {
//
//				mapResultado.put(tuplaDateTimeDouble.getKey(),
//						tuplaDateTimeDouble.getValue());
//			}
//
//		}
//
//		return mapResultado;
//	}

//	public Map<DateTime, Double> montosAntesDeFecha(DateTime unaFecha) {
//		Map<DateTime, Double> mapResultado = new HashMap<DateTime, Double>();
//
//		for (Entry<DateTime, Double> tuplaDateTimeDouble : this.montosGastadosEnFecha
//				.entrySet()) {
//			if (tuplaDateTimeDouble.getKey().isBefore(unaFecha)) {
//
//				mapResultado.put(tuplaDateTimeDouble.getKey(),
//						tuplaDateTimeDouble.getValue());
//			}
//
//		}
//
//		return mapResultado;
//	}

	public Boolean puedePagar(Double elTotalDeUnaCompra) {

		return this.ctaCte.saldoActual() >= elTotalDeUnaCompra;
	}

	public void avisoDeOferta() {
		// Se envia un mail notificando la oferta de un producto

	}


	/**
	 * debita de la cta corriente 
	 * el monto pasado por parametro
	 * @param monto
	 * @throws ElSaldoDeLaCtaCteEsInsuficienteExeption 
	 */
	public void debitar(Double monto) throws ElSaldoDeLaCtaCteEsInsuficienteExeption {
		this.ctaCte.debitar(monto);
		this.registrarUnaCompra(monto);
		
	}

}
